<!DOCTYPE html>
<html lang="zh-CN">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <!-- https://mp.weixin.qq.com/s/laQ5m5qjJJf3OeSvbEckNA -->
</head>

<body>

</body>
<script>
  // 常见错误类型
  "use strict"; {
    // ReferenceError 引用类型错误，当一个不存在的变量被引用时发生的错误。比如：console.log(a)。
    // EvalError 使用eval（）函数时抛出的异常
    // RangeError 标记一个错误，当设置的数值超出相应的范围触发。比如，new
    // TypeError 类型错误，表示值的类型非预期类型时发生的错误。
    // syntaxError 语法错误。比如 if(true) {。
    // URIError URI错误
    throw new ReferenceError(`出错了...`);
  };
</script>
<script>
  // 常见的错误
  "use strict"; {
    {
      /* 
      RangeError: Maximum call stack size exceeded  含义：超出了最大的堆栈大小
      为什么报错: 在使用递归时消耗大量堆栈，导致游览器抛出错误，因为游览器给分配的内存不是无限的。
      */
      /* function pow(x, n) {
        return x * pow(x, n - 1);
      }
      pow(10, 5) */
      // 处理办法 
      // 使用递归的时候，设定一个条件来终止递归，否则会无限循环，直到用尽调用堆栈空间为止。
      function pow(x, n) {
        if (n == 1) return x
        return x * pow(x, n - 1);
      }
      pow(10, 5)
    }; {
      /*
      ReferenceError: "x" is not defined  含义：“x”未定义
      为什么报错: 当你引用一个没有定义的变量时，抛出一个ReferenceError; 当你使用变量的时候，这个变量必须要声明，或者你可以确保它在你当前的脚本或作用域(scope) 中可用 
      */

    };
  };
</script>

</html>